<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=2">
<meta name="theme-color" content="#222">
<meta name="generator" content="Hexo 5.1.1">
  <link rel="apple-touch-icon" sizes="180x180" href="/hexo/images/apple-touch-icon-next.png">
  <link rel="icon" type="image/png" sizes="32x32" href="/hexo/images/favicon-32x32-next.png">
  <link rel="icon" type="image/png" sizes="16x16" href="/hexo/images/favicon-16x16-next.png">
  <link rel="mask-icon" href="/hexo/images/logo.svg" color="#222">

<link rel="stylesheet" href="/hexo/css/main.css">


<link rel="stylesheet" href="/hexo/lib/font-awesome/css/all.min.css">

<script id="hexo-configurations">
    var NexT = window.NexT || {};
    var CONFIG = {"hostname":"youchen12138.gitee.io","root":"/hexo/","scheme":"Gemini","version":"7.8.0","exturl":false,"sidebar":{"position":"left","display":"post","padding":18,"offset":12,"onmobile":false},"copycode":{"enable":false,"show_result":false,"style":null},"back2top":{"enable":true,"sidebar":false,"scrollpercent":false},"bookmark":{"enable":false,"color":"#222","save":"auto"},"fancybox":false,"mediumzoom":false,"lazyload":false,"pangu":false,"comments":{"style":"tabs","active":null,"storage":true,"lazyload":false,"nav":null},"algolia":{"hits":{"per_page":10},"labels":{"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}},"localsearch":{"enable":false,"trigger":"auto","top_n_per_article":1,"unescape":false,"preload":false},"motion":{"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"slideDownIn","post_body":"slideDownIn","coll_header":"slideLeftIn","sidebar":"slideUpIn"}}};
  </script>

  <meta property="og:type" content="website">
<meta property="og:title" content="幽辰的博客">
<meta property="og:url" content="https://youchen12138.gitee.io/hexo/page/13/index.html">
<meta property="og:site_name" content="幽辰的博客">
<meta property="og:locale" content="en_US">
<meta property="article:author" content="幽辰">
<meta name="twitter:card" content="summary">

<link rel="canonical" href="https://youchen12138.gitee.io/hexo/page/13/">


<script id="page-configurations">
  // https://hexo.io/docs/variables.html
  CONFIG.page = {
    sidebar: "",
    isHome : true,
    isPost : false,
    lang   : 'en'
  };
</script>

  <title>幽辰的博客</title>
  






  <noscript>
  <style>
  .use-motion .brand,
  .use-motion .menu-item,
  .sidebar-inner,
  .use-motion .post-block,
  .use-motion .pagination,
  .use-motion .comments,
  .use-motion .post-header,
  .use-motion .post-body,
  .use-motion .collection-header { opacity: initial; }

  .use-motion .site-title,
  .use-motion .site-subtitle {
    opacity: initial;
    top: initial;
  }

  .use-motion .logo-line-before i { left: initial; }
  .use-motion .logo-line-after i { right: initial; }
  </style>
</noscript>

</head>

<body itemscope itemtype="http://schema.org/WebPage">
  <div class="container use-motion">
    <div class="headband"></div>

    <header class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner"><div class="site-brand-container">
  <div class="site-nav-toggle">
    <div class="toggle" aria-label="Toggle navigation bar">
      <span class="toggle-line toggle-line-first"></span>
      <span class="toggle-line toggle-line-middle"></span>
      <span class="toggle-line toggle-line-last"></span>
    </div>
  </div>

  <div class="site-meta">

    <a href="/hexo/" class="brand" rel="start">
      <span class="logo-line-before"><i></i></span>
      <h1 class="site-title">幽辰的博客</h1>
      <span class="logo-line-after"><i></i></span>
    </a>
  </div>

  <div class="site-nav-right">
    <div class="toggle popup-trigger">
    </div>
  </div>
</div>




<nav class="site-nav">
  <ul id="menu" class="main-menu menu">
        <li class="menu-item menu-item-home">

    <a href="/hexo/" rel="section"><i class="fa fa-home fa-fw"></i>Home</a>

  </li>
        <li class="menu-item menu-item-tags">

    <a href="/hexo/tags/" rel="section"><i class="fa fa-tags fa-fw"></i>Tags<span class="badge">23</span></a>

  </li>
        <li class="menu-item menu-item-categories">

    <a href="/hexo/categories/" rel="section"><i class="fa fa-th fa-fw"></i>Categories<span class="badge">14</span></a>

  </li>
        <li class="menu-item menu-item-archives">

    <a href="/hexo/archives/" rel="section"><i class="fa fa-archive fa-fw"></i>Archives<span class="badge">127</span></a>

  </li>
  </ul>
</nav>




</div>
    </header>

    
  <div class="back-to-top">
    <i class="fa fa-arrow-up"></i>
    <span>0%</span>
  </div>


    <main class="main">
      <div class="main-inner">
        <div class="content-wrap">
          

          <div class="content index posts-expand">
            
      
  
  
  <article itemscope itemtype="http://schema.org/Article" class="post-block" lang="en">
    <link itemprop="mainEntityOfPage" href="https://youchen12138.gitee.io/hexo/2019/04/09/%E8%BF%90%E7%AE%97%E7%AC%A6/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="image" content="/hexo/images/avatar.jpg">
      <meta itemprop="name" content="幽辰">
      <meta itemprop="description" content="">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="幽辰的博客">
    </span>
      <header class="post-header">
        <h2 class="post-title" itemprop="name headline">
          
            <a href="/hexo/2019/04/09/%E8%BF%90%E7%AE%97%E7%AC%A6/" class="post-title-link" itemprop="url">运算符</a>
        </h2>

        <div class="post-meta">
            <span class="post-meta-item">
              <span class="post-meta-item-icon">
                <i class="far fa-calendar"></i>
              </span>
              <span class="post-meta-item-text">Posted on</span>

              <time title="Created: 2019-04-09 13:05:40" itemprop="dateCreated datePublished" datetime="2019-04-09T13:05:40+08:00">2019-04-09</time>
            </span>
              <span class="post-meta-item">
                <span class="post-meta-item-icon">
                  <i class="far fa-calendar-check"></i>
                </span>
                <span class="post-meta-item-text">Edited on</span>
                <time title="Modified: 2019-04-11 10:38:25" itemprop="dateModified" datetime="2019-04-11T10:38:25+08:00">2019-04-11</time>
              </span>
            <span class="post-meta-item">
              <span class="post-meta-item-icon">
                <i class="far fa-folder"></i>
              </span>
              <span class="post-meta-item-text">In</span>
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
                  <a href="/hexo/categories/JavaScript/" itemprop="url" rel="index"><span itemprop="name">JavaScript</span></a>
                </span>
            </span>

          

        </div>
      </header>

    
    
    
    <div class="post-body" itemprop="articleBody">

      
          <blockquote>
<p>typeof a可以获取a的类型（六个类型之一）它会将该值的类型以字符串形式返回。</p>
</blockquote>
<h2 id="各类型转换表"><a href="#各类型转换表" class="headerlink" title="各类型转换表"></a>各类型转换表</h2><p>String(数值) | String(语言) | Undefined | Null | Boolean(ture) | Boolean(false)</p>
<ul>
<li>| - | - | - | - | - | - |<br>数值| NaN| NaN| 0| 1| 0</li>
</ul>
<h2 id="非Number类型的值进行运算"><a href="#非Number类型的值进行运算" class="headerlink" title="非Number类型的值进行运算"></a>非Number类型的值进行运算</h2><p>都会将非Number的值转换为Number然后再进行运算，此时运算结果返回值为Number。</p>
<ul>
<li><p>任何值和NaN作运算结果为NaN</p>
</li>
<li><p>两个字符串相加，则会做“拼串”操作（不一定是数值，也可以汉字之类的）</p>
</li>
<li><p>两个字符串进行除+之外的运算（只能是数值，如果出现汉字等，则结果为NaN）</p>
</li>
<li><p>任何值和字符串相加，都要将值转换成字符串再进行相加。（此时的 + 起连接的作用）</p>
</li>
<li><p>可以通过让数字加上一个空的字符串，即可将其转换为string（隐式类型转换，由浏览器自动完成）</p>
</li>
<li><p>任何值做<code>- * /</code>运算时都会自动转换为Number，可以利用这一点做隐式的类型转换，可以通过为一个值<code> -0 *1 /1</code>来转换为Number</p>
</li>
</ul>
<h2 id="一元运算符"><a href="#一元运算符" class="headerlink" title="一元运算符"></a>一元运算符</h2><blockquote>
<p>一元运算符就是只涉及一个数的运算</p>
</blockquote>
<blockquote>
<p>一元运算符的返回值请参照以上运算规则</p>
</blockquote>
<ul>
<li><p><code>+</code>代表了<code>1*</code></p>
</li>
<li><p><code>-</code>代表了<code>-1*</code></p>
</li>
</ul>
<h2 id="关系运算符"><a href="#关系运算符" class="headerlink" title="关系运算符"></a>关系运算符</h2><p>进行<code>&gt;= &lt;= &gt; &lt;</code>等运算符</p>
<ul>
<li><p>若两边均为数值，则按照数学规则比较</p>
</li>
<li><p>若一边为数值，一边为其他类型，则将其他类型转换为数值再进行比较</p>
</li>
<li><p>若两边均为字符串，比较字符编码（一位一位进行比较）（通过Unicode编码表）</p>
</li>
</ul>
<blockquote>
<p>注意：比较两个字符串型的数字时，一定要转换类型</p>
</blockquote>
<blockquote>
<p>在字符串中使用转义字符输入Unicode编码<code>\u四位编码（16进制）</code></p>
</blockquote>
<blockquote>
<p>在网页中使用Unicode编码<code>&amp;#编码（10进制）</code></p>
</blockquote>

      
    </div>

    
    
    
      <footer class="post-footer">
        <div class="post-eof"></div>
      </footer>
  </article>
  
  
  

      
  
  
  <article itemscope itemtype="http://schema.org/Article" class="post-block" lang="en">
    <link itemprop="mainEntityOfPage" href="https://youchen12138.gitee.io/hexo/2019/04/07/%E7%B1%BB%E5%9E%8B%E5%BC%BA%E5%88%B6%E8%BD%AC%E6%8D%A2/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="image" content="/hexo/images/avatar.jpg">
      <meta itemprop="name" content="幽辰">
      <meta itemprop="description" content="">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="幽辰的博客">
    </span>
      <header class="post-header">
        <h2 class="post-title" itemprop="name headline">
          
            <a href="/hexo/2019/04/07/%E7%B1%BB%E5%9E%8B%E5%BC%BA%E5%88%B6%E8%BD%AC%E6%8D%A2/" class="post-title-link" itemprop="url">类型强制转换</a>
        </h2>

        <div class="post-meta">
            <span class="post-meta-item">
              <span class="post-meta-item-icon">
                <i class="far fa-calendar"></i>
              </span>
              <span class="post-meta-item-text">Posted on</span>

              <time title="Created: 2019-04-07 19:32:25" itemprop="dateCreated datePublished" datetime="2019-04-07T19:32:25+08:00">2019-04-07</time>
            </span>
              <span class="post-meta-item">
                <span class="post-meta-item-icon">
                  <i class="far fa-calendar-check"></i>
                </span>
                <span class="post-meta-item-text">Edited on</span>
                <time title="Modified: 2020-08-26 00:05:26" itemprop="dateModified" datetime="2020-08-26T00:05:26+08:00">2020-08-26</time>
              </span>
            <span class="post-meta-item">
              <span class="post-meta-item-icon">
                <i class="far fa-folder"></i>
              </span>
              <span class="post-meta-item-text">In</span>
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
                  <a href="/hexo/categories/JavaScript/" itemprop="url" rel="index"><span itemprop="name">JavaScript</span></a>
                </span>
            </span>

          

        </div>
      </header>

    
    
    
    <div class="post-body" itemprop="articleBody">

      
          <h2 id="JavaScript中有六种类型"><a href="#JavaScript中有六种类型" class="headerlink" title="JavaScript中有六种类型"></a>JavaScript中有六种类型</h2><ul>
<li><p>String 字符串</p>
</li>
<li><p>Number 数值</p>
</li>
<li><p>Boolean 布尔值</p>
</li>
<li><p>Null 空值</p>
</li>
<li><p>Undefined 未定义</p>
</li>
<li><p>Object 对象</p>
</li>
</ul>
<blockquote>
<p>强制类型转换只能在String，Number，Boolean三者之间转换</p>
</blockquote>
<h2 id="数组与字符串互转"><a href="#数组与字符串互转" class="headerlink" title="数组与字符串互转"></a>数组与字符串互转</h2><p>在开发中经常需要把字符串与数组互转</p>
<h3 id="Array对象中的join-方法"><a href="#Array对象中的join-方法" class="headerlink" title="Array对象中的join()方法"></a>Array对象中的join()方法</h3><blockquote>
<p>该方法可以将数组转换为多种形式的字符串</p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">var a &#x3D; [1, 2, 3, 4, 5];</span><br><span class="line">a &#x3D; a.join(&quot;-&quot;);</span><br><span class="line">document.write(&quot;a类型 &#x3D; &quot; + typeof(a) + &quot;&lt;br&#x2F;&gt;&quot;)</span><br><span class="line">document.write(&quot;a的值 &#x3D; &quot; + a)</span><br></pre></td></tr></table></figure>
<p>结果为：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">a类型 &#x3D; string</span><br><span class="line">a的值 &#x3D; 1-2-3-4-5</span><br></pre></td></tr></table></figure>
<p>join()方法包含一个参数，用于定义合并元素的连字符，若不提供参数，则以逗号连接每个元素</p>
<h3 id="Array对象中的spilt-方法"><a href="#Array对象中的spilt-方法" class="headerlink" title="Array对象中的spilt()方法"></a>Array对象中的spilt()方法</h3><blockquote>
<p>该方法可以将字符串转换为数组</p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">var a &#x3D; [1, 2, 3, 4, 5];</span><br><span class="line">a &#x3D; a.join(&quot;-&quot;);</span><br><span class="line">var s &#x3D; a.spilt(&quot;-&quot;);</span><br><span class="line">document.write(&quot;a类型 &#x3D; &quot; + typeof(a) + &quot;&lt;br&#x2F;&gt;&quot;)</span><br><span class="line">document.write(&quot;a的值 &#x3D; &quot; + a)</span><br></pre></td></tr></table></figure>
<p>结果为：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">a类型 &#x3D; object</span><br><span class="line">a的值 &#x3D; 1-2-3-4-5</span><br></pre></td></tr></table></figure>

<h2 id="其他类型转换为字符串"><a href="#其他类型转换为字符串" class="headerlink" title="其他类型转换为字符串"></a>其他类型转换为字符串</h2><h3 id="toString-方法"><a href="#toString-方法" class="headerlink" title="toString()方法"></a>toString()方法</h3><blockquote>
<p>返回值为String类型</p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">var a &#x3D; 123;</span><br><span class="line">a &#x3D; a.tostring();</span><br><span class="line">document.write(a);</span><br></pre></td></tr></table></figure>
<p>结果为：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">String</span><br></pre></td></tr></table></figure>
<blockquote>
<p>Boolean和上面相同，toString()方法可以将Boolean转换为String类型</p>
</blockquote>
<blockquote>
<p>注：不能将Null和Undefined类型转换为String类型</p>
</blockquote>
<h2 id="字符串转换为数值"><a href="#字符串转换为数值" class="headerlink" title="字符串转换为数值"></a>字符串转换为数值</h2><h3 id="parseInt-方法"><a href="#parseInt-方法" class="headerlink" title="parseInt()方法"></a>parseInt()方法</h3><blockquote>
<p>将一个字符串转换为一个整数</p>
</blockquote>
<p>可以将字符串中的有效数值提取出来，比如示例，1是数值，继续；2是数值，继续；3是数值，继续；p不是数值，结束。</p>
<p>若a=123px45，强制转换类型之后的结果为123.</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">var a &#x3D; &quot;123px&quot;;</span><br><span class="line">a &#x3D; parseInt(a);</span><br><span class="line">&#x2F;&#x2F;从String转换为Number，结果为123</span><br></pre></td></tr></table></figure>

<h3 id="parseFloat-方法"><a href="#parseFloat-方法" class="headerlink" title="parseFloat()方法"></a>parseFloat()方法</h3><blockquote>
<p>将一个字符串转换为一个浮点数</p>
</blockquote>
<p>功能和parseInt相似，只是读取有效数值为浮点数而已。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">var a &#x3D; &quot;123.456px&quot;;</span><br><span class="line">a &#x3D; parseFloat(a);</span><br><span class="line">&#x2F;&#x2F;从String转换为Number，结果为123.456</span><br></pre></td></tr></table></figure>

<blockquote>
<p>如果对非String使用parseInt()或parseFloat()，它会将其转换为String然后再操作。</p>
</blockquote>
<h2 id="通用方法"><a href="#通用方法" class="headerlink" title="通用方法"></a>通用方法</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">var a &#x3D; 123;</span><br><span class="line">a &#x3D; String(a);&#x2F;&#x2F;其他的类型也可以这样转换</span><br></pre></td></tr></table></figure>
<blockquote>
<p>空字符串转换为数值时为0，有非数字的字符串转换为数值时为NaN</p>
</blockquote>
<blockquote>
<p>true布尔值转换为数值为1，false布尔值转换为数值为0</p>
</blockquote>
<blockquote>
<p>Undefined转换为数值时为NaN</p>
</blockquote>

      
    </div>

    
    
    
      <footer class="post-footer">
        <div class="post-eof"></div>
      </footer>
  </article>
  
  
  

      
  
  
  <article itemscope itemtype="http://schema.org/Article" class="post-block" lang="en">
    <link itemprop="mainEntityOfPage" href="https://youchen12138.gitee.io/hexo/2019/04/07/JS%E7%BC%96%E5%86%99%E4%BD%8D%E7%BD%AE/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="image" content="/hexo/images/avatar.jpg">
      <meta itemprop="name" content="幽辰">
      <meta itemprop="description" content="">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="幽辰的博客">
    </span>
      <header class="post-header">
        <h2 class="post-title" itemprop="name headline">
          
            <a href="/hexo/2019/04/07/JS%E7%BC%96%E5%86%99%E4%BD%8D%E7%BD%AE/" class="post-title-link" itemprop="url">JS编写位置</a>
        </h2>

        <div class="post-meta">
            <span class="post-meta-item">
              <span class="post-meta-item-icon">
                <i class="far fa-calendar"></i>
              </span>
              <span class="post-meta-item-text">Posted on</span>
              

              <time title="Created: 2019-04-07 18:47:29 / Modified: 18:53:08" itemprop="dateCreated datePublished" datetime="2019-04-07T18:47:29+08:00">2019-04-07</time>
            </span>
            <span class="post-meta-item">
              <span class="post-meta-item-icon">
                <i class="far fa-folder"></i>
              </span>
              <span class="post-meta-item-text">In</span>
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
                  <a href="/hexo/categories/JavaScript/" itemprop="url" rel="index"><span itemprop="name">JavaScript</span></a>
                </span>
            </span>

          

        </div>
      </header>

    
    
    
    <div class="post-body" itemprop="articleBody">

      
          <h2 id="button标签中的onclick"><a href="#button标签中的onclick" class="headerlink" title="button标签中的onclick"></a>button标签中的onclick</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&lt;button onclick&#x3D;&quot;alert(&#39;警告框内容&#39;);&quot;&gt;按钮&lt;&#x2F;button&gt;</span><br></pre></td></tr></table></figure>
<h2 id="a标签的超链接"><a href="#a标签的超链接" class="headerlink" title="a标签的超链接"></a>a标签的超链接</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&lt;a href&#x3D;&quot;javascript:alert(&#39;警告框内容&#39;);&quot;&gt;超链接&lt;&#x2F;a&gt;</span><br></pre></td></tr></table></figure>
<h2 id="script标签"><a href="#script标签" class="headerlink" title="script标签"></a>script标签</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">&lt;script&gt;</span><br><span class="line">    alert(&quot;警告框内容&quot;);</span><br><span class="line">&lt;&#x2F;script&gt;</span><br></pre></td></tr></table></figure>

<p>此方法会在浏览器加载完之后马上出现。</p>
<h2 id="外部文件"><a href="#外部文件" class="headerlink" title="外部文件"></a>外部文件</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&lt;script src&#x3D;&quot;绝对路径&quot;&gt;&lt;&#x2F;script&gt;</span><br></pre></td></tr></table></figure>
<p>该路径下写下js文件的具体内容（推荐此方法）</p>
<ul>
<li>可以在不同文件内同时引用</li>
<li>结构清晰</li>
<li>script标签一旦用于引入外部文件，就不能再编写代码了，即使编写浏览器也会忽略</li>
<li>如果需要，可以再创建一个script标签用于编写内部代码（执行顺序按代码位置，JS按代码从上到下执行）<blockquote>
<h3 id="lt-script-gt-一般写在body标签下"><a href="#lt-script-gt-一般写在body标签下" class="headerlink" title="&lt;script&gt;一般写在body标签下"></a><code>&lt;script&gt;</code>一般写在body标签下</h3></blockquote>
</li>
</ul>

      
    </div>

    
    
    
      <footer class="post-footer">
        <div class="post-eof"></div>
      </footer>
  </article>
  
  
  

      
  
  
  <article itemscope itemtype="http://schema.org/Article" class="post-block" lang="en">
    <link itemprop="mainEntityOfPage" href="https://youchen12138.gitee.io/hexo/2019/03/28/LeetCode-%E7%A7%BB%E4%BD%8D%E7%AC%A6/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="image" content="/hexo/images/avatar.jpg">
      <meta itemprop="name" content="幽辰">
      <meta itemprop="description" content="">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="幽辰的博客">
    </span>
      <header class="post-header">
        <h2 class="post-title" itemprop="name headline">
          
            <a href="/hexo/2019/03/28/LeetCode-%E7%A7%BB%E4%BD%8D%E7%AC%A6/" class="post-title-link" itemprop="url">LeetCode--移位符</a>
        </h2>

        <div class="post-meta">
            <span class="post-meta-item">
              <span class="post-meta-item-icon">
                <i class="far fa-calendar"></i>
              </span>
              <span class="post-meta-item-text">Posted on</span>

              <time title="Created: 2019-03-28 14:15:37" itemprop="dateCreated datePublished" datetime="2019-03-28T14:15:37+08:00">2019-03-28</time>
            </span>
              <span class="post-meta-item">
                <span class="post-meta-item-icon">
                  <i class="far fa-calendar-check"></i>
                </span>
                <span class="post-meta-item-text">Edited on</span>
                <time title="Modified: 2020-08-30 19:32:03" itemprop="dateModified" datetime="2020-08-30T19:32:03+08:00">2020-08-30</time>
              </span>
            <span class="post-meta-item">
              <span class="post-meta-item-icon">
                <i class="far fa-folder"></i>
              </span>
              <span class="post-meta-item-text">In</span>
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
                  <a href="/hexo/categories/%E5%85%B6%E4%BB%96/" itemprop="url" rel="index"><span itemprop="name">其他</span></a>
                </span>
            </span>

          

        </div>
      </header>

    
    
    
    <div class="post-body" itemprop="articleBody">

      
          <p>不得不说，自己的算法是真的差，差的也不仅仅是算法，更多的还是自己上课期间忽略的基础知识。<br>LeetCode第29题，题目描述如下：</p>
<blockquote>
<p>给定两个整数，被除数 dividend 和除数 divisor。将两数相除，要求不使用乘法、除法和 mod 运算符。<br>返回被除数 dividend 除以除数 divisor 得到的商。</p>
</blockquote>
<blockquote>
<p>示例 1:<br>输入: dividend = 10, divisor = 3<br>输出: 3<br>示例 2:<br>输入: dividend = 7, divisor = -3<br>输出: -2</p>
</blockquote>
<blockquote>
<p>说明:<br>被除数和除数均为 32 位有符号整数。<br>除数不为 0。<br>假设我们的环境只能存储 32 位有符号整数，其数值范围是 [−231,  231 − 1]。本题中，如果除法结果溢出，则返回 231 − 1。</p>
</blockquote>
<p>看到这道题，我的第一个想法：“一个数除以另一个数，可以转化成多次减法运算”。<br>然后我的第一个骚操作来了：</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">soultion</span></span>&#123;</span><br><span class="line">	<span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">divide</span><span class="params">(<span class="keyword">int</span> dividend, <span class="keyword">int</span> divisor)</span> </span>&#123;</span><br><span class="line">		<span class="keyword">int</span> result = <span class="number">0</span>;</span><br><span class="line">		<span class="keyword">while</span>(dividend &gt;= divisor)&#123;</span><br><span class="line">			dividend = dividend - divisor;</span><br><span class="line">			result++;</span><br><span class="line">		&#125;</span><br><span class="line">		<span class="keyword">return</span> result;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
<p>现在看到这段代码，我自己都佩服我自己。（手动鼓掌）</p>
<h3 id="其实这个想法还是没错的，错在于没考虑极端情况"><a href="#其实这个想法还是没错的，错在于没考虑极端情况" class="headerlink" title="其实这个想法还是没错的，错在于没考虑极端情况"></a>其实这个想法还是没错的，错在于没考虑极端情况</h3><p>举例子说明，比如第一组测试样例，10除以3这种“正常数字”（日常接触得到的计算量级）来说，这段代码并没有问题，可以正常运行，花费的时间也在可以接受的范围之内，但是现在问题来了：极端情况下会怎么样呢？</p>
<p>我们给dividend取int的最大值（2的31次方-1），divisor取值1，执行这段代码需要耗时多久？<br>不难算出，while循环需要执行2的31次方-1次，也就是二十一亿多次，很明显时间上是不允许的。所以我们需要改进这个算法。</p>
<p>在百度的帮助下，我认识了一个符号，叫移位符。好吧，这可能真的是很基础的东西，但是原谅我的菜，我真的是第一次听说这个东西。<br>简单介绍下移位符的作用：</p>
<blockquote>
<p>移位运算符在程序设计中，是位操作运算符的一种。移位运算符可以在二进制的基础上对数字进行平移。按照平移的方向和填充数字的规则分为三种：&lt;&lt;(左移)、&gt;&gt;(带符号右移)和&gt;&gt;&gt;(无符号右移)。</p>
</blockquote>
<p>拿右移<code>&gt;&gt;</code>举例子， <code>7&gt;&gt;1</code> 相当于 <code>7/2</code> <code>7&gt;&gt;2</code>相当于 <code>7/4</code>，即右移n位相当于除以2的n次方。<br>（从结果上看是这种效果）</p>
<p>具体的运算例子 <code>11&gt;&gt;2</code></p>
<blockquote>
<p>11的二进制形式为：0000 0000 0000 0000 0000 0000 0000 1011，然后把低位的最后两个数字移出，因为该数字是正数，所以在高位补零。则得到的最终结果是0000 0000 0000 0000 0000 0000 0000 0010。转换为十进制是2。</p>
</blockquote>
<p>有了这个积累，我们再来看这道题。<br>我们现在需要做的事情，就是减少while循环的次数，怎么减少呢？当然就是每次循环多减一点啦！<br>先上代码：</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span> </span>&#123;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">divide</span><span class="params">(<span class="keyword">int</span> dividend, <span class="keyword">int</span> divisor)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">long</span> m,n;</span><br><span class="line">        m = Math.abs((<span class="keyword">long</span>)dividend);<span class="comment">//被除数的绝对值</span></span><br><span class="line">        n = Math.abs((<span class="keyword">long</span>)divisor);<span class="comment">//除数的绝对值</span></span><br><span class="line">        <span class="keyword">if</span>(n == <span class="number">0</span> || (dividend == Integer.MIN_VALUE &amp;&amp; divisor == -<span class="number">1</span>))</span><br><span class="line">           <span class="keyword">return</span> Integer.MAX_VALUE;</span><br><span class="line">           <span class="keyword">int</span> sign = ((dividend &lt; <span class="number">0</span>) ^ (divisor &lt; <span class="number">0</span>)) ? -<span class="number">1</span> : <span class="number">1</span>;</span><br><span class="line">         <span class="keyword">if</span>(n == <span class="number">1</span>) <span class="keyword">return</span> (<span class="keyword">int</span>)((sign&gt;<span class="number">0</span>)? m:-m);</span><br><span class="line">           <span class="keyword">long</span> result = <span class="number">0</span>;</span><br><span class="line">           <span class="keyword">while</span>(m&gt;= n)&#123;</span><br><span class="line">                <span class="keyword">long</span> temp = n;</span><br><span class="line">                <span class="keyword">long</span> count = <span class="number">1</span>;</span><br><span class="line">               <span class="keyword">while</span>(m &gt; (temp&lt;&lt;<span class="number">1</span>))&#123;</span><br><span class="line">                   temp = temp&lt;&lt;<span class="number">1</span>;</span><br><span class="line">                   count = count&lt;&lt;<span class="number">1</span>;</span><br><span class="line">               &#125;</span><br><span class="line">               result = result + count;</span><br><span class="line">               m = m - temp;</span><br><span class="line">           &#125;</span><br><span class="line">           <span class="keyword">return</span> (<span class="keyword">int</span>)((sign&gt;<span class="number">0</span>)? result:-result);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
<p>好了，现在我来解释下这个程序。</p>
<p>首先看内层循环 <code>while(m &gt; (temp&lt;&lt;1))</code>里面的东西，<code>temp</code>等于除数，当m（被除数的绝对值）大于两倍的除数的时候，temp乘以二，count乘以二，循环到temp的两倍大于被除数m为止。这样循环的结果是循环次数会以指数级减少。<br>我们还是拿最开始的例子，dividend = pow（2，31）-1；divisor = 1；<br>第一次进入外层循环，然后进入内层循环，内层的while执行30次后结束，此时temp = 2的30次方，count = 2的30次方。接着向下执行第18和第19两行代码，整个循环第一次结束后，m = 1。</p>
<h3 id="对比21亿次循环，我们的算法有了质的飞跃（为自己鼓掌）。"><a href="#对比21亿次循环，我们的算法有了质的飞跃（为自己鼓掌）。" class="headerlink" title="对比21亿次循环，我们的算法有了质的飞跃（为自己鼓掌）。"></a>对比21亿次循环，我们的算法有了质的飞跃（为自己鼓掌）。</h3><h3 id="但是，我的骚操作远没有结束上面放出的这段代码是我最后一次提交成功的代码。"><a href="#但是，我的骚操作远没有结束上面放出的这段代码是我最后一次提交成功的代码。" class="headerlink" title="但是，我的骚操作远没有结束上面放出的这段代码是我最后一次提交成功的代码。"></a>但是，我的骚操作远没有结束上面放出的这段代码是我最后一次提交成功的代码。</h3><p>前面还有十几次失败经验还没总结呢。</p>
<p>首先第一个问题，变量声明里面的 <code>long</code> 为什么要用long？<br>还是上面那个极端的例子，在判断的时候 temp&lt;&lt;1，如果用int，会发生超出int最大值的问题，然后temp会变成一个负数，然后这个循环永远结束不了，然后就超时了。。。。。。</p>
<p>第二个是边界值问题，在这个题目中，边界情况下只有一种可能会越界，就是当被除数为int最小值，除数为-1时，得到的商会大于int的最大值，所以我们需要考虑这种情况。</p>
<p>最后就是符号判别问题，用异或判断被除数与除数是否相同，保证输出结果符号的正确性。（当然不想用异或运算的也可以使用if写明条件判断）</p>
<p>当然按照这个思路做完以后，我也有个问题：为什么非要用移位运算符呢？<br>count = count + count不也一样么？<br>抱着这个疑问，我又改了改程序，又跑了一次。</p>
<h2 id="结论是：确实可以，只不过会比移位运算符慢2ms"><a href="#结论是：确实可以，只不过会比移位运算符慢2ms" class="headerlink" title="结论是：确实可以，只不过会比移位运算符慢2ms"></a>结论是：确实可以，只不过会比移位运算符慢2ms</h2><p>至于为什么会慢2ms…我给自己留个坑吧，初步猜测是计算机处理二进制会更快一些，当然这只是猜测而已，具体什么原因我有空再去验证一下……</p>

      
    </div>

    
    
    
      <footer class="post-footer">
        <div class="post-eof"></div>
      </footer>
  </article>
  
  
  

      
  
  
  <article itemscope itemtype="http://schema.org/Article" class="post-block" lang="en">
    <link itemprop="mainEntityOfPage" href="https://youchen12138.gitee.io/hexo/2019/03/22/Git%E6%8E%A8%E9%80%81%E5%88%B0%E9%A1%B9%E7%9B%AE%E7%AC%94%E8%AE%B0/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="image" content="/hexo/images/avatar.jpg">
      <meta itemprop="name" content="幽辰">
      <meta itemprop="description" content="">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="幽辰的博客">
    </span>
      <header class="post-header">
        <h2 class="post-title" itemprop="name headline">
          
            <a href="/hexo/2019/03/22/Git%E6%8E%A8%E9%80%81%E5%88%B0%E9%A1%B9%E7%9B%AE%E7%AC%94%E8%AE%B0/" class="post-title-link" itemprop="url">Git推送到项目笔记</a>
        </h2>

        <div class="post-meta">
            <span class="post-meta-item">
              <span class="post-meta-item-icon">
                <i class="far fa-calendar"></i>
              </span>
              <span class="post-meta-item-text">Posted on</span>

              <time title="Created: 2019-03-22 14:26:48" itemprop="dateCreated datePublished" datetime="2019-03-22T14:26:48+08:00">2019-03-22</time>
            </span>
              <span class="post-meta-item">
                <span class="post-meta-item-icon">
                  <i class="far fa-calendar-check"></i>
                </span>
                <span class="post-meta-item-text">Edited on</span>
                <time title="Modified: 2020-08-26 14:42:39" itemprop="dateModified" datetime="2020-08-26T14:42:39+08:00">2020-08-26</time>
              </span>
            <span class="post-meta-item">
              <span class="post-meta-item-icon">
                <i class="far fa-folder"></i>
              </span>
              <span class="post-meta-item-text">In</span>
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
                  <a href="/hexo/categories/Git/" itemprop="url" rel="index"><span itemprop="name">Git</span></a>
                </span>
            </span>

          

        </div>
      </header>

    
    
    
    <div class="post-body" itemprop="articleBody">

      
          <h2 id="首先，我们要在git-Bash里面创建版本库"><a href="#首先，我们要在git-Bash里面创建版本库" class="headerlink" title="首先，我们要在git Bash里面创建版本库"></a>首先，我们要在git Bash里面创建版本库</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">$ mkdir learngit &#x2F;&#x2F;创建新文件夹</span><br><span class="line">$ cd learngit</span><br><span class="line">$ pwd</span><br><span class="line">&#x2F;Users&#x2F;michael&#x2F;learngit</span><br></pre></td></tr></table></figure>

<ol>
<li><code>fork</code>github上仓库</li>
<li>通过<code>git init</code>命令将该文件夹初始化</li>
<li><code>git clone &lt;http/SSH&gt;</code>克隆远程库到本地库</li>
<li><code>git remote add &lt;别用名&gt; &lt;http/SSH&gt;</code>关联远程库（一定要关联自己克隆的远程库）</li>
<li>可以通过<code>git remote -v</code>来查看关联的远程库</li>
<li><code>git checkout -b &lt;branch&gt;</code>来创建新的分支</li>
<li><code>vim &lt;filename&gt;</code>编写文件</li>
<li><code>git add</code> <code>git commit -m &quot;&lt;提交说明&gt;&quot;</code>将文件提交到本地库里。</li>
<li>通过<code>git push -u &lt;别用名&gt; &lt;branch&gt;</code>将修改推送到自己克隆的远程库中</li>
<li>在github上面的仓库上可以看到自己的修改</li>
<li>在Comparing changes界面中点击pull request</li>
</ol>

      
    </div>

    
    
    
      <footer class="post-footer">
        <div class="post-eof"></div>
      </footer>
  </article>
  
  
  

      
  
  
  <article itemscope itemtype="http://schema.org/Article" class="post-block" lang="en">
    <link itemprop="mainEntityOfPage" href="https://youchen12138.gitee.io/hexo/2019/03/17/Git%E7%AC%94%E8%AE%B0/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="image" content="/hexo/images/avatar.jpg">
      <meta itemprop="name" content="幽辰">
      <meta itemprop="description" content="">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="幽辰的博客">
    </span>
      <header class="post-header">
        <h2 class="post-title" itemprop="name headline">
          
            <a href="/hexo/2019/03/17/Git%E7%AC%94%E8%AE%B0/" class="post-title-link" itemprop="url">Git笔记</a>
        </h2>

        <div class="post-meta">
            <span class="post-meta-item">
              <span class="post-meta-item-icon">
                <i class="far fa-calendar"></i>
              </span>
              <span class="post-meta-item-text">Posted on</span>

              <time title="Created: 2019-03-17 12:00:32" itemprop="dateCreated datePublished" datetime="2019-03-17T12:00:32+08:00">2019-03-17</time>
            </span>
              <span class="post-meta-item">
                <span class="post-meta-item-icon">
                  <i class="far fa-calendar-check"></i>
                </span>
                <span class="post-meta-item-text">Edited on</span>
                <time title="Modified: 2020-08-24 21:48:24" itemprop="dateModified" datetime="2020-08-24T21:48:24+08:00">2020-08-24</time>
              </span>
            <span class="post-meta-item">
              <span class="post-meta-item-icon">
                <i class="far fa-folder"></i>
              </span>
              <span class="post-meta-item-text">In</span>
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
                  <a href="/hexo/categories/Git/" itemprop="url" rel="index"><span itemprop="name">Git</span></a>
                </span>
            </span>

          

        </div>
      </header>

    
    
    
    <div class="post-body" itemprop="articleBody">

      
          <h2 id="Git介绍"><a href="#Git介绍" class="headerlink" title="Git介绍"></a>Git介绍</h2><ul>
<li>Git是分布式版本控制系统</li>
<li>集中式VS分布式，SVN VS Git </li>
</ul>
<ol>
<li>SVN和Git主要的区别在于历史版本维护的位置</li>
<li>Git本地仓库包含代码库还有历史库，在本地的环境开发就可以记录历史而SVN的历史库存在于中央仓库，每次对比与提交代码都必须连接到中央仓库才能进行。</li>
<li>这样的好处在于： <ul>
<li>自己可以在脱机环境查看开发的版本历史。</li>
<li>多人开发时如果充当中央仓库的Git仓库挂了，可以随时创建一个新的中央仓库然后同步就立刻恢复了中央库。</li>
</ul>
</li>
</ol>
<hr>
<h2 id="Git命令"><a href="#Git命令" class="headerlink" title="Git命令"></a>Git命令</h2><h3 id="创建版本库"><a href="#创建版本库" class="headerlink" title="创建版本库"></a><strong>创建版本库</strong></h3><h4 id="初始化一个Git仓库"><a href="#初始化一个Git仓库" class="headerlink" title="初始化一个Git仓库"></a>初始化一个Git仓库</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git init</span><br></pre></td></tr></table></figure>

<h4 id="添加文件到Git仓库"><a href="#添加文件到Git仓库" class="headerlink" title="添加文件到Git仓库"></a>添加文件到Git仓库</h4><p>包括两步：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ git add &lt;file&gt;</span><br><span class="line">$ git commit -m &quot;description&quot;</span><br></pre></td></tr></table></figure>
<p><code>git add</code>可以反复多次使用，添加多个文件，<code>git commit</code>可以一次提交很多文件，-m后面输入的是本次提交的说明，可以输入任意内容。</p>
<h4 id="查看当前路径"><a href="#查看当前路径" class="headerlink" title="查看当前路径"></a>查看当前路径</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ pwd</span><br></pre></td></tr></table></figure>

<h4 id="退出vi编辑器"><a href="#退出vi编辑器" class="headerlink" title="退出vi编辑器"></a>退出vi编辑器</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Esc : wq</span><br></pre></td></tr></table></figure>

<h3 id="查看工作区状态"><a href="#查看工作区状态" class="headerlink" title="查看工作区状态"></a><strong>查看工作区状态</strong></h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git status</span><br></pre></td></tr></table></figure>

<h3 id="查看修改内容"><a href="#查看修改内容" class="headerlink" title="查看修改内容"></a><strong>查看修改内容</strong></h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$ git diff</span><br><span class="line">$ git diff --cached</span><br><span class="line">$ git diff HEAD -- &lt;file&gt;</span><br></pre></td></tr></table></figure>
<ul>
<li><code>git diff</code> 可以查看工作区(work dict)和暂存区(stage)的区别</li>
<li><code>git diff --cached</code> 可以查看暂存区(stage)和分支(master)的区别</li>
<li><code>git diff HEAD -- &lt;file&gt;</code> 可以查看工作区和版本库里面最新版本的区别</li>
</ul>
<h3 id="查看提交日志"><a href="#查看提交日志" class="headerlink" title="查看提交日志"></a><strong>查看提交日志</strong></h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git log</span><br></pre></td></tr></table></figure>

<h3 id="简化日志输出信息"><a href="#简化日志输出信息" class="headerlink" title="简化日志输出信息"></a><strong>简化日志输出信息</strong></h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ git log --pretty&#x3D;oneline</span><br><span class="line">$ git log --oneline   省略部分版本号</span><br></pre></td></tr></table></figure>

<h3 id="查看命令历史"><a href="#查看命令历史" class="headerlink" title="查看命令历史"></a><strong>查看命令历史</strong></h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git reflog</span><br></pre></td></tr></table></figure>

<h3 id="查看文件修改状况"><a href="#查看文件修改状况" class="headerlink" title="查看文件修改状况"></a><strong>查看文件修改状况</strong></h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ git diff</span><br><span class="line">$ git diff HEAD -- &lt;filename&gt;.txt 可以查看工作区和版本库里面最新版本的区别</span><br></pre></td></tr></table></figure>

<h3 id="版本回退"><a href="#版本回退" class="headerlink" title="版本回退"></a><strong>版本回退</strong></h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git reset --hard HEAD^</span><br></pre></td></tr></table></figure>

<p>以上命令是返回上一个版本，在Git中，用HEAD表示当前版本，上一个版本就是<code>HEAD^</code>，上上一个版本是<code>HEAD^^</code>，往上100个版本写成<code>HEAD~100</code>。</p>
<h3 id="回退指定版本号"><a href="#回退指定版本号" class="headerlink" title="回退指定版本号"></a><strong>回退指定版本号</strong></h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git reset --hard commit_id</span><br></pre></td></tr></table></figure>

<p><code>commit_id</code>是版本号，是一个用SHA1计算出的序列</p>
<h3 id="工作区、暂存区和版本库"><a href="#工作区、暂存区和版本库" class="headerlink" title="工作区、暂存区和版本库"></a><strong>工作区、暂存区和版本库</strong></h3><p>工作区：在电脑里能看到的目录； 版本库：在工作区有一个隐藏目录<code>.git</code>，是Git的版本库。 Git的版本库中存了很多东西，其中最重要的就是称为stage（或者称为index）的暂存区，还有Git自动创建的<code>master</code>，以及指向<code>master</code>的指针<code>HEAD</code>。</p>
<p>进一步解释一些命令：</p>
<ul>
<li><code>git add</code>实际上是把文件添加到暂存区</li>
<li><code>git commit</code>实际上是把暂存区的所有内容提交到当前分支</li>
</ul>
<p><img src="https://upload-images.jianshu.io/upload_images/16731485-06ed812d42c5ea6a.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="工作区，暂存区，版本库之间关系图"></p>
<hr>
<h2 id="设置签名"><a href="#设置签名" class="headerlink" title="设置签名"></a><strong>设置签名</strong></h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">项目级别：</span><br><span class="line"></span><br><span class="line">$ git config user.name tom-pro</span><br><span class="line">$ git config user.email goodMorning@qq.com</span><br><span class="line"></span><br><span class="line">系统用户级别：</span><br><span class="line"></span><br><span class="line">$ git config --global user.name tom-pro</span><br><span class="line">$ git config --global user.email goodMorning@qq.com</span><br><span class="line"></span><br><span class="line">显示用户名与邮箱：</span><br><span class="line"></span><br><span class="line">$ git config --list</span><br></pre></td></tr></table></figure>
<p>作用：区分不同开发人员的身份</p>
<p>命令：</p>
<pre><code>项目级别/仓库级别：仅在当前本地库范围内有效

系统用户级别：登录当前操作系统的用户范围</code></pre>
<p>级别优先级：</p>
<pre><code>就近原则：项目级别优先于系统用户级别

二者都没有，则Git Bash显示错误</code></pre>
<p>工作区：</p>
<pre><code>就是能在电脑里看到的目录</code></pre>
<p>版本库：</p>
<pre><code>工作区都有一个隐藏目录.git，这个不算工作区，而是Git的版本库

Git的版本库里存了很多东西，最重要的是称为stage（或者叫index）的暂存区，还有Git自动创建的第一个分支master，以及指向master的一个指针叫HEAD。    </code></pre>
<h3 id="撤销修改"><a href="#撤销修改" class="headerlink" title="撤销修改"></a><strong>撤销修改</strong></h3><h4 id="丢弃工作区的修改"><a href="#丢弃工作区的修改" class="headerlink" title="丢弃工作区的修改"></a>丢弃工作区的修改</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git checkout -- &lt;file&gt;  也可还原删除</span><br></pre></td></tr></table></figure>

<p>该命令是指将文件在工作区的修改全部撤销，这里有两种情况：</p>
<ol>
<li><p>一种是file自修改后还没有被放到暂存区，现在，撤销修改就回到和版本库一模一样的状态；</p>
</li>
<li><p>一种是file已经添加到暂存区后，又作了修改，现在，撤销修改就回到添加到暂存区后的状态。</p>
</li>
</ol>
<p>总之，就是让这个文件回到最近一次<code>git commit</code>或<code>git add</code>时的状态。</p>
<h4 id="丢弃暂存区的修改"><a href="#丢弃暂存区的修改" class="headerlink" title="丢弃暂存区的修改"></a>丢弃暂存区的修改</h4><p>分两步： 第一步，把暂存区的修改撤销掉(unstage)，重新放回工作区：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git reset HEAD &lt;file&gt;</span><br></pre></td></tr></table></figure>
<p>第二步，撤销工作区的修改</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git checkout -- &lt;file&gt;</span><br></pre></td></tr></table></figure>
<p>小结：</p>
<ol>
<li>当你改乱了工作区某个文件的内容，想直接丢弃工作区的修改时，用命令<code>git checkout -- &lt;file&gt;</code>。</li>
<li>当你不但改乱了工作区某个文件的内容，还添加到了暂存区时，想丢弃修改，分两步，第一步用命令<code>git reset HEAD &lt;file&gt;</code>，就回到了第一步，第二步按第一步操作。</li>
<li>已经提交了不合适的修改到版本库时，想要撤销本次提交，进行版本回退，前提是没有推送到远程库。</li>
</ol>
<h3 id="删除文件"><a href="#删除文件" class="headerlink" title="删除文件"></a><strong>删除文件</strong></h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git rm &lt;file&gt;</span><br></pre></td></tr></table></figure>
<p><code>git rm &lt;file&gt;</code>相当于执行</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ rm &lt;file&gt;</span><br><span class="line">$ git add &lt;file&gt;</span><br></pre></td></tr></table></figure>
<p>进一步的解释</p>
<p>Q：比如执行了<code>rm text.txt</code> 误删了怎么恢复？ </p>
<p>A：执行<code>git checkout -- text.txt</code> 把版本库的东西重新写回工作区就行了</p>
<p>Q：如果执行了<code>git rm text.txt</code>我们会发现工作区的text.txt也删除了，怎么恢复？</p>
<p>A：先撤销暂存区修改，重新放回工作区，然后再从版本库写回到工作区</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ git reset head text.txt</span><br><span class="line">$ git checkout -- text.txt</span><br></pre></td></tr></table></figure>
<p>Q：如果真的想从版本库里面删除文件怎么做？ </p>
<p>A：执行g<code>it commit -m &quot;delete text.txt&quot;</code>，提交后最新的版本库将不包含这个文件</p>
<h3 id="查看目录"><a href="#查看目录" class="headerlink" title="查看目录"></a><strong>查看目录</strong></h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">cat &lt;filename&gt; 一次显示整个文件</span><br><span class="line">cat &gt;filename 只能创建新文件，不能编辑已有文件</span><br><span class="line">cat file1 file2 &gt; file 将几个文件合并为一个文件</span><br></pre></td></tr></table></figure>

<h3 id="远程仓库"><a href="#远程仓库" class="headerlink" title="远程仓库"></a><strong>远程仓库</strong></h3><h4 id="创建SSH-Key"><a href="#创建SSH-Key" class="headerlink" title="创建SSH Key"></a>创建SSH Key</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ ssh-keygen -t rsa -C &quot;youremail@example.com&quot;</span><br></pre></td></tr></table></figure>
<h4 id="关联远程仓库"><a href="#关联远程仓库" class="headerlink" title="关联远程仓库"></a>关联远程仓库</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git remote add origin https:&#x2F;&#x2F;github.com&#x2F;username&#x2F;repositoryname.git</span><br></pre></td></tr></table></figure>
<h4 id="推送到远程仓库"><a href="#推送到远程仓库" class="headerlink" title="推送到远程仓库"></a>推送到远程仓库</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git push -u origin master</span><br></pre></td></tr></table></figure>
<p><code>-u</code> 表示第一次推送master分支的所有内容，此后，每次本地提交后，只要有必要，就可以使用命令<code>git push origin master</code>推送最新修改。</p>
<h4 id="从远程克隆"><a href="#从远程克隆" class="headerlink" title="从远程克隆"></a>从远程克隆</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git clone https:&#x2F;&#x2F;github.com&#x2F;usern&#x2F;repositoryname.git</span><br></pre></td></tr></table></figure>
<h3 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h3><p>要关联一个远程库，使用命令<code>git remote add origin git@server-name:path/repo-name.git</code>;</p>
<p>关联后，使用命令<code>git push -u origin master</code>第一次推送master分支的所有内容；<br>此后，每次本地提交后，只要有必要，就可以使用命令<code>git push origin master</code>推送最新修改；</p>
<p>分布式版本系统的最大好处之一是在本地工作完全不需要考虑远程库的存在，也就是有没有联网都可以正常工作，而SVN在没有联网的时候是拒绝干活的！当有网络的时候，再把本地提交推送一下就完成了同步，真是太方便了！</p>
<hr>
<h2 id="分支"><a href="#分支" class="headerlink" title="分支"></a><strong>分支</strong></h2><h4 id="创建分支"><a href="#创建分支" class="headerlink" title="创建分支"></a>创建分支</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git branch &lt;branchname&gt;</span><br></pre></td></tr></table></figure>
<h4 id="查看分支"><a href="#查看分支" class="headerlink" title="查看分支"></a>查看分支</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git branch</span><br></pre></td></tr></table></figure>
<p><code>git branch</code>命令会列出所有分支，当前分支前面会标一个*号。</p>
<h4 id="切换分支"><a href="#切换分支" class="headerlink" title="切换分支"></a>切换分支</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git checkout &lt;branchname&gt;</span><br></pre></td></tr></table></figure>
<h4 id="创建-切换分支"><a href="#创建-切换分支" class="headerlink" title="创建+切换分支"></a>创建+切换分支</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git checkout -b &lt;branchname&gt;</span><br></pre></td></tr></table></figure>
<h4 id="合并某分支到当前分支"><a href="#合并某分支到当前分支" class="headerlink" title="合并某分支到当前分支"></a>合并某分支到当前分支</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git merge &lt;branchname&gt;</span><br></pre></td></tr></table></figure>
<h4 id="删除分支"><a href="#删除分支" class="headerlink" title="删除分支"></a>删除分支</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git branch -d &lt;branchname&gt;</span><br></pre></td></tr></table></figure>
<h4 id="查看分支合并图"><a href="#查看分支合并图" class="headerlink" title="查看分支合并图"></a>查看分支合并图</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git log --graph</span><br></pre></td></tr></table></figure>
<p>当Git无法自动合并分支时，就必须首先解决冲突。解决冲突后，再提交，合并完成。用<code>git log --graph</code>命令可以看到分支合并图。</p>
<h4 id="普通模式合并分支"><a href="#普通模式合并分支" class="headerlink" title="普通模式合并分支"></a>普通模式合并分支</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git merge --no-ff -m &quot;description&quot; &lt;branchname&gt;</span><br></pre></td></tr></table></figure>
<p>因为本次合并要创建一个新的commit，所以加上<code>-m</code>参数，把commit描述写进去。合并分支时，加上<code>--no-ff</code>参数就可以用普通模式合并，能看出来曾经做过合并，包含作者和时间戳等信息，而fast forward合并就看不出来曾经做过合并。</p>
<h4 id="保存工作现场"><a href="#保存工作现场" class="headerlink" title="保存工作现场"></a>保存工作现场</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git stash</span><br></pre></td></tr></table></figure>
<h4 id="查看工作现场"><a href="#查看工作现场" class="headerlink" title="查看工作现场"></a>查看工作现场</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git stash list</span><br></pre></td></tr></table></figure>
<h4 id="恢复工作现场"><a href="#恢复工作现场" class="headerlink" title="恢复工作现场"></a>恢复工作现场</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$ git stash drop 删除stash内容</span><br><span class="line">$ git stash apply 恢复工作现场，但stash内容不删除</span><br><span class="line">$ git stash pop  恢复工作现场的同时将stash内容删除</span><br></pre></td></tr></table></figure>
<h4 id="强行删除一个没有合并过的分支"><a href="#强行删除一个没有合并过的分支" class="headerlink" title="强行删除一个没有合并过的分支"></a>强行删除一个没有合并过的分支</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git branch -D &lt;branchname&gt;</span><br></pre></td></tr></table></figure>
<h4 id="查看远程库信息"><a href="#查看远程库信息" class="headerlink" title="查看远程库信息"></a>查看远程库信息</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git remote -v</span><br></pre></td></tr></table></figure>
<h4 id="在本地创建和远程分支对应的分支"><a href="#在本地创建和远程分支对应的分支" class="headerlink" title="在本地创建和远程分支对应的分支"></a>在本地创建和远程分支对应的分支</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git checkout -b branch-name origin&#x2F;branch-name</span><br></pre></td></tr></table></figure>
<p>本地和远程分支的名称最好一致。</p>
<h4 id="建立本地分支和远程分支的关联"><a href="#建立本地分支和远程分支的关联" class="headerlink" title="建立本地分支和远程分支的关联"></a>建立本地分支和远程分支的关联</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git branch --set-upstream branch-name origin&#x2F;branch-name；</span><br></pre></td></tr></table></figure>
<h4 id="从本地推送分支"><a href="#从本地推送分支" class="headerlink" title="从本地推送分支"></a>从本地推送分支</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git push origin branch-name</span><br></pre></td></tr></table></figure>
<p>如果推送失败，先用<code>git pull</code>抓取远程的新提交；</p>
<h4 id="从远程抓取分支"><a href="#从远程抓取分支" class="headerlink" title="从远程抓取分支"></a>从远程抓取分支</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git pull</span><br></pre></td></tr></table></figure>
<p>如果有冲突，要先处理冲突。</p>
<h4 id="从远程抓取分支（变基）"><a href="#从远程抓取分支（变基）" class="headerlink" title="从远程抓取分支（变基）"></a>从远程抓取分支（变基）</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git pull --rebase origin master</span><br></pre></td></tr></table></figure>
<p>如果有冲突，要先处理冲突。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">git rebase --abort 会放弃合并，回到rebase操作之前的状态，之前的提交的不会丢弃；</span><br><span class="line"></span><br><span class="line">git rebase --skip 则会将引起冲突的commits丢弃掉（慎用！！）；</span><br><span class="line"></span><br><span class="line">git rebase --continue 合并冲突，结合&quot;git add 文件&quot;命令一起用与修复冲突，提示开发者，一步一步地有没有解决冲突。（fix conflicts and then run “git rebase --continue”）</span><br></pre></td></tr></table></figure>

<hr>
<h2 id="标签"><a href="#标签" class="headerlink" title="标签"></a><strong>标签</strong></h2><p>tag就是一个让人容易记住的有意义的名字，它跟某个commit绑在一起。</p>
<h4 id="新建一个标签"><a href="#新建一个标签" class="headerlink" title="新建一个标签"></a>新建一个标签</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git tag &lt;tagname&gt;</span><br></pre></td></tr></table></figure>
<p>命令<code>git tag &lt;tagname&gt;</code>用于新建一个标签，默认为HEAD，也可以指定一个commit id。</p>
<h4 id="指定标签信息"><a href="#指定标签信息" class="headerlink" title="指定标签信息"></a>指定标签信息</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git tag -a &lt;tagname&gt; -m &lt;description&gt; &lt;branchname&gt; or commit_id</span><br></pre></td></tr></table></figure>
<p><code>git tag -a &lt;tagname&gt; -m &quot;blablabla...&quot;</code>可以指定标签信息。</p>
<h4 id="PGP签名标签"><a href="#PGP签名标签" class="headerlink" title="PGP签名标签"></a>PGP签名标签</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git tag -s &lt;tagname&gt; -m &lt;description&gt; &lt;branchname&gt; or commit_id</span><br></pre></td></tr></table></figure>
<p><code>git tag -s &lt;tagname&gt; -m &quot;blablabla...&quot;</code>可以用PGP签名标签。</p>
<h4 id="查看所有标签"><a href="#查看所有标签" class="headerlink" title="查看所有标签"></a>查看所有标签</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git tag</span><br></pre></td></tr></table></figure>
<h4 id="推送一个本地标签"><a href="#推送一个本地标签" class="headerlink" title="推送一个本地标签"></a>推送一个本地标签</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git push origin &lt;tagname&gt;</span><br></pre></td></tr></table></figure>
<h4 id="推送全部未推送过的本地标签"><a href="#推送全部未推送过的本地标签" class="headerlink" title="推送全部未推送过的本地标签"></a>推送全部未推送过的本地标签</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git push origin --tags</span><br></pre></td></tr></table></figure>
<h4 id="删除一个本地标签"><a href="#删除一个本地标签" class="headerlink" title="删除一个本地标签"></a>删除一个本地标签</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git tag -d &lt;tagname&gt;</span><br></pre></td></tr></table></figure>
<h4 id="删除一个远程标签"><a href="#删除一个远程标签" class="headerlink" title="删除一个远程标签"></a>删除一个远程标签</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git push origin :refs&#x2F;tags&#x2F;&lt;tagname&gt;</span><br></pre></td></tr></table></figure>

<h3 id="多屏控制方式"><a href="#多屏控制方式" class="headerlink" title="多屏控制方式"></a><strong>多屏控制方式</strong></h3><pre><code>空格向下翻页

b向上翻页

q退出</code></pre>
<hr>
<h2 id="变基"><a href="#变基" class="headerlink" title="变基"></a><strong>变基</strong></h2><h3 id="指令"><a href="#指令" class="headerlink" title="指令"></a>指令</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">git checkout &lt;branch&gt;</span><br><span class="line">git rebase master</span><br><span class="line">将&lt;branch&gt;的分支变基到master上</span><br></pre></td></tr></table></figure>

<p>在分支和master上都有修改时，直接使用<code>git merge &lt;branch&gt;</code>合并会有冲突。</p>
<p><code>git rebase master</code>这条指令是将branch的修改到master之前的提交上，再将这个修改合并到master的修改上，注意，这时，之前branch分支仍然存在，需删掉分支。</p>
<p>变基的根本目的是使提交路线成为一条直线。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git rebase --onto master server client</span><br></pre></td></tr></table></figure>

<p>取出client分支，找出client和server的共同祖先之后的修改，将client变基到master分支上，再切换到master分支（git checkout master），将client合并到master上，则不会发生冲突，server保持不变。</p>

      
    </div>

    
    
    
      <footer class="post-footer">
        <div class="post-eof"></div>
      </footer>
  </article>
  
  
  

      
  
  
  <article itemscope itemtype="http://schema.org/Article" class="post-block" lang="en">
    <link itemprop="mainEntityOfPage" href="https://youchen12138.gitee.io/hexo/2019/03/15/Git%E7%AE%80%E4%BB%8B/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="image" content="/hexo/images/avatar.jpg">
      <meta itemprop="name" content="幽辰">
      <meta itemprop="description" content="">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="幽辰的博客">
    </span>
      <header class="post-header">
        <h2 class="post-title" itemprop="name headline">
          
            <a href="/hexo/2019/03/15/Git%E7%AE%80%E4%BB%8B/" class="post-title-link" itemprop="url">Git简介</a>
        </h2>

        <div class="post-meta">
            <span class="post-meta-item">
              <span class="post-meta-item-icon">
                <i class="far fa-calendar"></i>
              </span>
              <span class="post-meta-item-text">Posted on</span>

              <time title="Created: 2019-03-15 20:11:19" itemprop="dateCreated datePublished" datetime="2019-03-15T20:11:19+08:00">2019-03-15</time>
            </span>
              <span class="post-meta-item">
                <span class="post-meta-item-icon">
                  <i class="far fa-calendar-check"></i>
                </span>
                <span class="post-meta-item-text">Edited on</span>
                <time title="Modified: 2019-03-18 22:20:54" itemprop="dateModified" datetime="2019-03-18T22:20:54+08:00">2019-03-18</time>
              </span>
            <span class="post-meta-item">
              <span class="post-meta-item-icon">
                <i class="far fa-folder"></i>
              </span>
              <span class="post-meta-item-text">In</span>
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
                  <a href="/hexo/categories/Git/" itemprop="url" rel="index"><span itemprop="name">Git</span></a>
                </span>
            </span>

          

        </div>
      </header>

    
    
    
    <div class="post-body" itemprop="articleBody">

      
          <h2 id="集中式版本控制系统："><a href="#集中式版本控制系统：" class="headerlink" title="集中式版本控制系统："></a>集中式版本控制系统：</h2><p>版本库是集中存放在中央服务器的，而干活的时候，用的都是自己的电脑，所以要先从中央服务器取得最新的版本，然后开始干活，干完活了，再把自己干的活推送到中央服务器。</p>
<p><img src="http://www.nowamagic.net/librarys/images/201401/2014_01_03_06.jpg" alt="集中式版本控制简图"></p>
<h2 id="分布式版本控制系统："><a href="#分布式版本控制系统：" class="headerlink" title="分布式版本控制系统："></a>分布式版本控制系统：</h2><ul>
<li><p>无中央服务器,每个人的电脑都是一个完整的版本库。</p>
</li>
<li><p>工作时无需联网。</p>
</li>
<li><p>在多人修改同一文件后，只需将各自的修改推送给对方，就可以无限看到对方的修改。</p>
</li>
<li><p>安全性高，因为每个人电脑上都有完整的版本库。</p>
</li>
</ul>
<p><img src="http://www.nowamagic.net/librarys/images/201401/2014_01_03_07.jpg" alt="分布式版本控制简图"></p>
<h3 id="版本控制工具应该具有的功能"><a href="#版本控制工具应该具有的功能" class="headerlink" title="版本控制工具应该具有的功能"></a>版本控制工具应该具有的功能</h3><h4 id="1-协同修改"><a href="#1-协同修改" class="headerlink" title="1. 协同修改"></a>1. 协同修改</h4><ul>
<li>多人并行不悖的修改服务器端的同一文件。</li>
</ul>
<h4 id="2-数据备份"><a href="#2-数据备份" class="headerlink" title="2. 数据备份"></a>2. 数据备份</h4><ul>
<li>不仅保存目录和文件的当前状态，还能保存每一个提交过的历史状态。</li>
</ul>
<h4 id="3-版本管理"><a href="#3-版本管理" class="headerlink" title="3. 版本管理"></a>3. 版本管理</h4><ul>
<li><p>在保存每一个版本的文件信息的时候要做到不保存重复数据，以节约存储空间，提高运行效率。</p>
</li>
<li><p>这方面SVN采用的是增量式管理的方式，而Git采用了<a target="_blank" rel="noopener" href="https://zhidao.baidu.com/question/68685918.html">文件系统快照</a>的方式。</p>
</li>
<li><p>增量式管理：只保存增加的那一点，需要时将增加的与原来的文件拼接。</p>
</li>
</ul>
<h4 id="4-权限控制"><a href="#4-权限控制" class="headerlink" title="4. 权限控制"></a>4. 权限控制</h4><ul>
<li><p>对团队中参与开发的人员进行权限控制。</p>
</li>
<li><p>对团队外开发者贡献的代码进行审核（Git独有）</p>
</li>
</ul>
<h4 id="5-历史记录"><a href="#5-历史记录" class="headerlink" title="5. 历史记录"></a>5. 历史记录</h4><ul>
<li><p>查看修改人、修改时间、修改内容、日志信息。</p>
</li>
<li><p>将本地文件恢复到某一个历史状态。</p>
</li>
</ul>
<h4 id="6-分支管理"><a href="#6-分支管理" class="headerlink" title="6. 分支管理"></a>6. 分支管理</h4><ul>
<li>允许开发团队在工作过程中多条生产线同时推进任务，进一步提高效率。</li>
</ul>
<h3 id="集中式和分布式的主要区别"><a href="#集中式和分布式的主要区别" class="headerlink" title="集中式和分布式的主要区别"></a><a target="_blank" rel="noopener" href="https://www.cnblogs.com/wx1993/p/7680877.html">集中式和分布式的主要区别</a></h3><h2 id="版本控制介绍"><a href="#版本控制介绍" class="headerlink" title="版本控制介绍"></a>版本控制介绍</h2><h3 id="版本控制"><a href="#版本控制" class="headerlink" title="版本控制"></a>版本控制</h3><p>工程设计领域中使用版本控制管理工程蓝图的设计过程。在IT开发过程也可以使用版本控制思想管理代码的版本迭代。</p>
<h3 id="Git的优势"><a href="#Git的优势" class="headerlink" title="Git的优势"></a>Git的优势</h3><ul>
<li><p>大部分操作在本地完成，不需要联网</p>
</li>
<li><p>完整性保证</p>
</li>
<li><p>尽可能添加数据而不是删除或修改数据</p>
</li>
<li><p>分支操作非常快捷流畅</p>
</li>
<li><p>与Linux命令全面兼容</p>
</li>
</ul>

      
    </div>

    
    
    
      <footer class="post-footer">
        <div class="post-eof"></div>
      </footer>
  </article>
  
  
  


  
  <nav class="pagination">
    <a class="extend prev" rel="prev" href="/hexo/page/12/"><i class="fa fa-angle-left" aria-label="Previous page"></i></a><a class="page-number" href="/hexo/">1</a><span class="space">&hellip;</span><a class="page-number" href="/hexo/page/12/">12</a><span class="page-number current">13</span>
  </nav>



          </div>
          

<script>
  window.addEventListener('tabs:register', () => {
    let { activeClass } = CONFIG.comments;
    if (CONFIG.comments.storage) {
      activeClass = localStorage.getItem('comments_active') || activeClass;
    }
    if (activeClass) {
      let activeTab = document.querySelector(`a[href="#comment-${activeClass}"]`);
      if (activeTab) {
        activeTab.click();
      }
    }
  });
  if (CONFIG.comments.storage) {
    window.addEventListener('tabs:click', event => {
      if (!event.target.matches('.tabs-comment .tab-content .tab-pane')) return;
      let commentClass = event.target.classList[1];
      localStorage.setItem('comments_active', commentClass);
    });
  }
</script>

        </div>
          
  
  <div class="toggle sidebar-toggle">
    <span class="toggle-line toggle-line-first"></span>
    <span class="toggle-line toggle-line-middle"></span>
    <span class="toggle-line toggle-line-last"></span>
  </div>

  <aside class="sidebar">
    <div class="sidebar-inner">

      <ul class="sidebar-nav motion-element">
        <li class="sidebar-nav-toc">
          Table of Contents
        </li>
        <li class="sidebar-nav-overview">
          Overview
        </li>
      </ul>

      <!--noindex-->
      <div class="post-toc-wrap sidebar-panel">
      </div>
      <!--/noindex-->

      <div class="site-overview-wrap sidebar-panel">
        <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
    <img class="site-author-image" itemprop="image" alt="幽辰"
      src="/hexo/images/avatar.jpg">
  <p class="site-author-name" itemprop="name">幽辰</p>
  <div class="site-description" itemprop="description"></div>
</div>
<div class="site-state-wrap motion-element">
  <nav class="site-state">
      <div class="site-state-item site-state-posts">
          <a href="/hexo/archives/">
        
          <span class="site-state-item-count">127</span>
          <span class="site-state-item-name">posts</span>
        </a>
      </div>
      <div class="site-state-item site-state-categories">
            <a href="/hexo/categories/">
          
        <span class="site-state-item-count">14</span>
        <span class="site-state-item-name">categories</span></a>
      </div>
      <div class="site-state-item site-state-tags">
            <a href="/hexo/tags/">
          
        <span class="site-state-item-count">23</span>
        <span class="site-state-item-name">tags</span></a>
      </div>
  </nav>
</div>



      </div>

    </div>
  </aside>
  <div id="sidebar-dimmer"></div>


      </div>
    </main>

    <footer class="footer">
      <div class="footer-inner">
        

        

<div class="copyright">
  
  &copy; 
  <span itemprop="copyrightYear">2021</span>
  <span class="with-love">
    <i class="fa fa-heart"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">幽辰</span>
</div>
  <div class="powered-by">Powered by <a href="https://hexo.io/" class="theme-link" rel="noopener" target="_blank">Hexo</a> & <a href="https://theme-next.org/" class="theme-link" rel="noopener" target="_blank">NexT.Gemini</a>
  </div>

        








      </div>
    </footer>
  </div>

  
  <script src="/hexo/lib/anime.min.js"></script>
  <script src="/hexo/lib/velocity/velocity.min.js"></script>
  <script src="/hexo/lib/velocity/velocity.ui.min.js"></script>

<script src="/hexo/js/utils.js"></script>

<script src="/hexo/js/motion.js"></script>


<script src="/hexo/js/schemes/pisces.js"></script>


<script src="/hexo/js/next-boot.js"></script>




  















  

  

</body>
</html>
